#ifndef _EXPRESSIONVALUE_
#define _EXPRESSIONVALUE_

#include <string>
#include "ValueType.h"

using namespace std;

struct ExpressionValue
{
    ExpressionValue();
    ExpressionValue(long iLongValue);
    ExpressionValue(double iDoubleValue);
    ExpressionValue(string* iStringValue);
    ExpressionValue(bool iBoolValue);

    // ExpressionValue(ClassInstance* iObjectValue);
    // ExpressionValue(ArrayInstance* iArrayValue);
    ~ExpressionValue();

    ExpressionValue* Copy();

    //void PrintToStdOut(string iParentName);

    union Value
    {
        long LongValue;
        double DoubleValue;
        string* StringValue;
        bool BoolValue;
        // TODO: ClassInstance* ObjectValue;
        // TODO: ArrayInstance* ArrayValue;
    };

    Value fValue;
    ValueType fType;

    void Reference()    { fRefCount++; }
    void Dereference()  { fRefCount--; }
    bool IsReferenced() { return fRefCount > 0; }

private:
    void ConstructorBase();

    int fRefCount;
};

#endif
